Cluster mode
環境変数CLUSTERに数値をセットすると、1つのDockerコンテナ内でapplication server (node.js)プロセスがforkします これをcluster modeと呼びます
DB、Redis、ルーティングなど、スケールさせる為の要所を説明しています
Cluster modeは、application server (node.js)をスケールアウトさせる手段の1つです
Dockerコンテナの数を増やす
docker-composeの--scale=オプション等
1つのDockerコンテナの中に起動するnode.jsプロセス数を増やす
こっちがcluster modeです
設定例
code:docker-compose.yml
app:
image: notainc/scrapbox:latest
environment:
CLUSTER: 4
workerが4つforkする
https://gyazo.com/c670a58ee1e4cff77a402ee1cbdb3fb7
cluster数は2〜4程度にするのが一般的な様です
動作環境
forkしたプロセスはそれぞれ
メモリ512MB
1つの論理CPUスレッド
を必要とします
つまり以下は同等のリソースが必要です
forkせず1プロセスだけのDockerコンテナを4つ起動した場合
CLUSTER=4でプロセスを4つにforkさせたDockerコンテナを、1つ起動した場合
CLUSTER=2でプロセスを2つにforkさせたDockerコンテナを、2つ起動した場合
4論理CPUコア、2GBのメモリを割り当ててください
また、forkしたプロセスの分だけ、application serverからMongoDBやRedisへのコネクション数も増加します
クラウド版では
CLUSTER=2で2プロセスにforkしたサーバー
これを数十台起動
2020/4ごろからこの構成で運用しています
forkしたプロセスの終了
親プロセスが子プロセスを環境変数CLUSTERの数だけforkで作成します
この時、子プロセスが不正終了すると
親プロセスが子プロセスを即座に補充します
子プロセスをkillすると確認できます
親プロセスは、外から受け取ったsignalを子プロセスに伝播します
コンテナ内のClusterを終了したい場合は、親プロセスにSIGTERMを送信してください 全ての子プロセスの終了を待って、親プロセスも終了します
親プロセスが終了すれば、Dockerコンテナも停止します